package wci.backend.interpreter;

import wci.intermediate.*;
import wci.backend.Backend;
import wci.message.*;

import static wci.intermediate.icodeimpl.ICodeKeyImpl.*;
import static wci.message.MessageType.RUNTIME_ERROR;

/**
 * <h1>RuntimeErrorHandler</h1>
 *
 * <p>后端解释器运行时错误处理类</p>
 *
 * <p>Copyright (c) 2009 by Ronald Mak</p>
 * <p>For instructional purposes only.  No warranties.</p>
 */
public class RuntimeErrorHandler
{
	//允许的最大错误数，超过直接退出
    private static final int MAX_ERRORS = 5;

    private static int errorCount = 0;    //错误数
    
    public static int getErrorCount()
    {
        return errorCount;
    }

    /**
     * 标记运行时的一个错误
     * @param node 出问题的子树跟节点
     * @param errorCode 错误码
     * @param backend 后端处理器(编译器或者解释器)
     */
    public void flag(ICodeNode node, RuntimeErrorCode errorCode,
                     Backend backend)
    {
        String lineNumber = null;
        //查找出现“行”属性的父节点，比如 a = (a*(d+e+)); 行属性会在整个赋值语句上，但是
        //出错的d+e+表达式子树不会有行属性。
        while ((node != null) && (node.getAttribute(LINE) == null)) {
            node = node.getParent();
        }

        // 通知后端
        backend.sendMessage(
            new Message(RUNTIME_ERROR,
                        new Object[] {errorCode.toString(),
                                      (Integer) node.getAttribute(LINE)}));

        if (++errorCount > MAX_ERRORS) {
            System.out.println("*** 错误太多，程序退出！");
            System.exit(-1);
        }
    }
}
